# Project 4 サーボ制御 ### **1.説明** ![image-20250509084654137](media/A25.png) サーボモーターは位置制御用の回転アクチュエーターです。主にハウジング、回路基板、コアレスモーター、ギア、位置センサーで構成されています。動作原理は、サーボがMCUや受信機から送られる信号を受け取り、周期20ms、幅1.5msの基準信号を生成し、取得した直流バイアス電圧とポテンショメーターの電圧を比較して電圧差を出力することです。 ![image-20250509084710719](media/A26.png) 一般的に、サーボには茶色、赤、オレンジの3本の線があります。茶色の線はグランド、赤は正極線、オレンジは信号線です。 サーボモーターの回転角度はPWM(パルス幅変調)信号のデューティサイクルを調整することで制御されます。PWM信号の標準周期は20ms(50Hz)です。理論上、幅は1ms〜2msの範囲ですが、実際には0.5ms〜2.5msの範囲です。この幅は0°から180°の回転角度に対応します。ただし、ブランドによっては同じ信号でも回転角度が異なる場合があります。 ![image-20250509084727797](media/A27.png) 対応するサーボ角度は以下の通りです: ![image-20250509084739380](media/A28.png) ### **2.仕様** - 動作電圧:DC 4.8V ~ 6V - 動作角度範囲:約180°(500 → 2500 μsec時) - パルス幅範囲:500 → 2500 μsec - 無負荷速度:0.12 ± 0.01 秒 / 60(DC 4.8V) 0.1 ± 0.01 秒 / 60(DC 6V) - 無負荷電流:200 ± 20mA(DC 4.8V) 220 ± 20mA(DC 6V) - 停止トルク:1.3 ± 0.01kg·cm(DC 4.8V) 1.5 ± 0.1kg·cm(DC 6V) - 停止電流:≦ 850mA(DC 4.8V) ≦ 1000mA(DC 6V) - 待機電流:3 ± 1mA(DC 4.8V) 4 ± 1mA(DC 6V) ### **3.コンポーネント** | 開発ボード *1 | 8833 モータードライバー *1 | サーボ*1 | | :----------------------------------------------------------: | :--------------------------------------: | :----------------------------------------------------------: | | ![img](media/A8.jpg) | ![img](media/A9.jpg) | ![image-20250509084654137](media/A25.png) | | 18650 バッテリーホルダー*1 | USB ケーブル*1 | 18650 バッテリー*2(別途用意) | | ![image-20250509084950601](media/A29.png) | ![img](media/A12.jpg) | ![image-20250509085010348](media/A30.png) | ### **4.配線図** ![image-20250509085038006](media/A31.png) 配線メモ:サーボはG(GND)、V(VCC)、A3に接続します。サーボの茶色線はGnd(G)に、赤線は5V(V)に、オレンジ線はA3に接続します。 サーボは駆動電流の要求が高いため、外部電源に接続する必要があります。一般的に開発ボードの電流は十分ではありません。外部電源を接続しないと、開発ボードが焼損する恐れがあります。 ### **5.テストコード** ```c //**************************************************************************** /* keyestudio 4wd BT Car lesson 4.1 Servo http://www.keyestudio.com */ #define servoPin A3 // サーボのピン int pos; // サーボの角度変数 int pulsewidth; // サーボのパルス幅変数 void setup() { pinMode(servoPin, OUTPUT); // サーボのピンを出力に設定 procedure(0); // サーボの角度を0度に設定 } void loop() { for (pos = 0; pos <= 180; pos += 1) { // 0度から180度まで移動 // 1度ずつステップで procedure(pos); // 変数 'pos' の位置にサーボを動かす delay(15); // サーボの回転速度を制御 } for (pos = 180; pos >= 0; pos -= 1) { // 180度から0度まで移動 procedure(pos); // 変数 'pos' の位置にサーボを動かす delay(15); } } // サーボを制御する関数 void procedure(int myangle) { pulsewidth = myangle * 11 + 500; // パルス幅の値を計算 digitalWrite(servoPin,HIGH); delayMicroseconds(pulsewidth); // 高レベルの時間がパルス幅 digitalWrite(servoPin,LOW); delay((20 - pulsewidth / 1000)); // サイクルは20msで、残りの時間は低レベル } //**************************************************************************** ``` ### **6.テスト結果** コードをV4.0ボードに正常にアップロードした後、配線図に従って配線を接続し、外部電源を入れます。電源を入れたら、ディップスイッチを「ON」側に切り替えると、サーボは0°から180°の範囲で揺れ動きます。 ### **7.拡張練習** さらに、ライブラリファイルを使ってサーボを制御することも可能です。詳細は以下のリンクを参照してください:[https://www.arduino.cc/en/Reference/Servo](https://www.arduino.cc/en/Reference/Servo)。 ![image-20250509085122183](media/A32.png) ```c //*************************************************************************** /* keyestudio 4wd BT Car lesson 4.2 Servo http://www.keyestudio.com */ #include Servo myservo; // サーボを制御するためのサーボオブジェクトを作成 // ほとんどのボードで12個のサーボオブジェクトを作成可能 int pos = 0; // サーボの位置を格納する変数 void setup() { myservo.attach(A3); // ピンA3にサーボを接続してサーボオブジェクトに割り当てる } void loop() { for (pos = 0; pos <= 180; pos += 1) { // 0度から180度まで移動 // 1度ずつステップで myservo.write(pos); // 変数 'pos' の位置にサーボを動かす delay(15); // サーボが位置に到達するまで15ms待つ } for (pos = 180; pos >= 0; pos -= 1) { // 180度から0度まで移動 myservo.write(pos); // 変数 'pos' の位置にサーボを動かす delay(15); // サーボが位置に到達するまで15ms待つ } } //*************************************************************************** ``` コードをV4.0ボードに正常にアップロードした後、配線図に従って配線を接続し、外部電源を入れます。電源を入れたら、ディップスイッチを「ON」側に切り替えると、サーボは0°から180°の範囲で揺れ動きます。通常はライブラリファイルで制御します。 ### **8.コード説明** Arduinoには**\#include \**(サーボ機能と文)が付属しています。 以下はサーボ機能の一般的な文です: 1). **attach(interface)**——サーボのインターフェースを設定 2). **write(angle)**——サーボの回転角度を設定、設定可能な角度範囲は0°から180° 3). **read()**——サーボの角度を読み取る、つまり“write()”のコマンド値を読み取る 4). **attached()**——サーボのパラメータがインターフェースに送られているか判定 注意: 上記の書き方は「servo変数名.具体的な文() 」の形式です。例:myservo.attach(9)。